import { app, shell, BrowserWindow, ipcMain, globalShortcut, Menu } from 'electron'
import { join, dirname } from 'path'
import { electronApp, optimizer, is } from '@electron-toolkit/utils'
import { getRandom } from './main/utils/ping-pong.js'
import { showTxt } from './main/utils/showTxt.js'
import { fileURLToPath } from 'url'
import { StreamConfigManager } from './main/utils/stream-config-manager.js'
import { FfmpegManager } from './main/utils/ffmpeg-manager.js'
import { HlsHttpServer } from './main/utils/hls-http-server.js'
import { start } from 'repl'
import fs from 'fs' // 添加fs模块导入
import appConfig from './main/config/app-config.js'
import Logger from './main/utils/logger.js'

// 导入新的窗口管理模块
import {
  createMainWindow,
  createApplicationMenu,
  windowsWebContentsSend,
  registerGlobalShortcuts,
  cleanupWindowResources
} from './main/utils/browser-windows.js'

// 定义全局配置，供其他模块访问
global.appConfig = appConfig


Logger.info('App is starting...')
// 为ES模块提供__dirname和__filename
const __filename = fileURLToPath(import.meta.url)
const __dirname_local = dirname(__filename)
Logger.info('当前目录: ' + __dirname_local)
// app.getPath('userData')  // 获取用户数据目录，这是存储日志的最佳位置
Logger.info('用户数据目录: ' + app.getPath('userData'))

console.log(`[应用启动] 当前工作目录 (process.cwd()) : ${process.cwd()}`)
console.log(`[应用启动] 当前EXE文件所在目录 (process.execPath) : ${process.execPath}`)
console.log(`[应用启动] 用户数据目录 (app.getPath('userData')) : ${app.getPath('userData')}`)
console.log(`[应用启动] 当前模块URL (import.meta.url)   : ${import.meta.url}`)
console.log(`[应用启动] 当前文件所在目录 (__filename)   : ${__filename}`)
console.log(`[应用启动] 当前环境变量 (process.env.NODE_ENV) : ${process.env.NODE_ENV}`)
console.log(`[应用启动] 工作目录 (appConfig.workspacePath) : ${appConfig.workspacePath}`)

// 使用默认导入获取logger实例
// const logger = require('./utils/logger').default
Logger.info('应用已启动')

// 创建流配置管理器实例
const streamConfigManager = new StreamConfigManager()

// 创建FFmpeg管理器实例
const ffmpegManager = new FfmpegManager()

// 创建HLS服务器实例
const hlsHttpServer = new HlsHttpServer()

// 全局窗口实例引用
let mainWindow = null

/**
 * 广播流配置列表到所有渲染进程窗口
 * 该函数负责从流配置管理器获取所有流配置信息，并将其发送到所有已打开的渲染进程窗口
 * 主要用于同步和更新UI界面上显示的流配置列表数据
 */
function broadcastStreamsConfigList() {
  // 从流配置管理器获取所有流配置信息
  const streams = streamConfigManager.streams
  
  // 通过事件总线将流配置列表广播到所有渲染进程窗口
  windowsWebContentsSend('streams-config-list', streams)
}

// 当 Electron 初始化完成并准备创建浏览器窗口时调用此方法
app.whenReady().then(() => {
  try {
    // 设置应用用户模型ID (Windows需要)
    electronApp.setAppUserModelId('com.electron')

    // 创建应用菜单
    createApplicationMenu()

    // 在所有环境中启用窗口快捷键 (包括生产环境)
    app.on('browser-window-created', (_, window) => {
      optimizer.watchWindowShortcuts(window)
    })

    // 注册全局快捷键
    registerGlobalShortcuts()

    // 创建主窗口
    mainWindow = createMainWindow(__dirname_local, ffmpegManager, hlsHttpServer)

    // 窗口关闭时注销快捷键和清理资源
    mainWindow.on('closed', () => {
      cleanupWindowResources()
      mainWindow = null
    })

    // 启动HLS服务器
    hlsHttpServer.start()

    // 定义计数器
    let count = 0
    // IPC测试
    ipcMain.on('ping', () => console.log('pong - ' + count++ + ' - ' + getRandom(100, 999)))
    ipcMain.on('showTxt', showTxt)

    // 流配置相关的IPC事件处理
    ipcMain.on('addStreamConfig', (event, config) => {
      console.log('收到添加流配置请求:', config)
      event.reply('addLog', '[INFO] 收到添加流配置请求')

      // 验证配置
      // if (!config.id || !config.name || !config.rtsp) {
      //   event.reply('addLog', '[ERROR] 流配置信息不完整')
      //   return
      // }

      // 验证RTSP地址格式
      // if (!config.rtsp.startsWith('rtsp://')) {
      //   event.reply('addLog', '[ERROR] RTSP地址必须以rtsp://开头')
      //   return
      // }

      try {
        // 添加流配置
        const newStream = streamConfigManager.addStream(config)

        // 发送日志，json 转 字符串
        event.reply('addLog', `[INFO] 添加流配置成功: ${JSON.stringify(newStream)}`)

        // 广播更新后的流配置列表到所有窗口
        broadcastStreamsConfigList()
      } catch (error) {
        console.error('添加流配置失败:', error)
        event.reply('addLog', `[ERROR] 添加流配置失败: ${error.message}`)
      }
    })

    ipcMain.on('loadStreamsConfig', (event) => {
      console.log('收到加载流配置请求')
      event.reply('streams-config-list', streamConfigManager.streams)
    })

    ipcMain.on('delete-stream-config', (event, index) => {
      console.log('收到删除流配置请求:', index)

      const deletedStream = streamConfigManager.deleteStream(index)
      if (deletedStream) {
        event.reply('addLog', `[INFO] 删除流配置成功: ${deletedStream.name}`)
        // 广播更新后的流配置列表到所有窗口
        broadcastStreamsConfigList()
      } else {
        event.reply('addLog', `[ERROR] 删除流配置失败: 索引 ${index} 无效`)
      }
    })

    // 开启转码服务
    ipcMain.on('startStream', (event, streamId) => {
      const config = {
        // startBtnText: '启动中 ...'
      }
      // streamConfigManager.updateStream(config)
      // broadcastStreamsConfigList()
      // event.reply('addLog', `[INFO] 收到启动转码服务的请求，编号: ${index}`)
      event.reply('addLog', `[INFO] 收到启动转码服务的请求，id: ${streamId}`)

      const streamConfig = streamConfigManager.getStreamById(streamId)
      const res = ffmpegManager.startStream(streamConfig)
      event.reply('addLog', `[INFO] 启动转码服务响应: ${JSON.stringify(res)}`)
      // const success = true // 模拟启动成功
      if (res.success) {
        config.status = 'running'
        // config.stopBtnText = '停止'
        event.reply('addLog', `[INFO] 启动转码服务成功，id: ${streamId} <br>hls地址: ${res.hlsUrl}`)
        streamConfigManager.updateStream({...res, status: 'running'})
      } else {
        // config.startBtnText = '启动'
        event.reply(
          'addLog',
          `[ERROR] 启动转码服务失败: ${JSON.stringify(streamConfig)}`
        )
      }
      broadcastStreamsConfigList()
    })

    // 停止所有转码服务
    ipcMain.on('stopAllStreaming', (event) => {
      ffmpegManager.stopAllStreams()
      event.reply('addLog', `[INFO] 收到停止所有转码服务的请求`)
    })

    ipcMain.on('stopStreaming', (event, streamId) => {
      const config = {
        id: streamId
      }
      // streamConfigManager.updateStream(config)
      // broadcastStreamsConfigList()
      event.reply('addLog', `[INFO] 收到停止转码服务的请求，id: ${streamId}`)

      const success = ffmpegManager.stopStream(streamId)
      // const success = true // 模拟停止成功
      if (success) {
        config.status = 'stopped'
        config.startBtnText = '启动'
        event.reply('addLog', `[INFO] 停止转码服务成功，id: ${streamId}`)
      } else {
        config.stopBtnText = '停止'
        event.reply('addLog', `[ERROR] 停止转码服务失败，id: ${streamId}`)
      }
      streamConfigManager.updateStream(config)
      broadcastStreamsConfigList()
    })

    // 修改 toggle-stream-status 事件处理
    // ipcMain.on('toggle-stream-status-1', (event, index) => {
    //   console.log('收到切换流状态请求:', index)

    //   const streams = streamConfigManager.getAllStreams()
    //   console.log('所有流:', streams)
    //   if (index >= 0 && index < streams.length) {
    //     const stream = streams[index]

    //     console.log('当前流状态:', stream.status)
    //     console.log(
    //       `流信息: rtsp:${stream.rtsp}, hls:${stream.hls}, status: ${stream.status}, 端口: ${stream.port}`
    //     )

    //     if (stream.status === 'stopped') {
    //       // 启动转码
    //       const success = ffmpegManager.startStream(stream)
    //       if (success) {
    //         stream.status = 'running'
    //         streamConfigManager.saveConfig()
    //         event.reply('addLog', `[INFO] 启动流成功: ${stream.name}`)
    //       } else {
    //         event.reply('addLog', `[ERROR] 启动流失败: ${stream.name}`)
    //       }
    //     } else {
    //       // 停止转码
    //       const success = ffmpegManager.stopStream(stream.id)
    //       if (success) {
    //         stream.status = 'stopped'
    //         streamConfigManager.saveConfig()
    //         event.reply('addLog', `[INFO] 停止流成功: ${stream.name}`)
    //       } else {
    //         event.reply('addLog', `[ERROR] 停止流失败: ${stream.name}`)
    //       }
    //     }

    //     // 广播更新后的流配置列表到所有窗口
    //     broadcastStreamsConfigList()
    //   } else {
    //     event.reply('addLog', `[ERROR] 切换流状态失败: 索引 ${index} 无效`)
    //   }

    //   const stream = streamConfigManager.getStreamById(index)
    //   if (stream) {
    //     // 启动监控
    //   }
    // })

    // 导入预置配置
    ipcMain.on('import-preset-config', (event) => {
      console.log('收到导入预置配置请求')
      const success = streamConfigManager.importPresetConfig()
      if (success) {
        event.reply('addLog', '[INFO] 预置配置导入成功')
        broadcastStreamsConfigList()
      } else {
        event.reply('addLog', '[ERROR] 预置配置导入失败')
      }
    })

    // 重置为预置配置
    ipcMain.on('reset-to-preset-config', (event) => {
      console.log('收到重置为预置配置请求')
      const success = streamConfigManager.resetToPresetConfig()
      if (success) {
        event.reply('addLog', '[INFO] 已重置为预置配置')
        broadcastStreamsConfigList()
      } else {
        event.reply('addLog', '[ERROR] 重置为预置配置失败')
      }
    })

    // 创建窗口 (修复：在正确的位置调用) 
    createWindow()

    app.on('activate', function () {
      // 在macOS上，当点击dock图标且没有其他窗口打开时，重新创建一个窗口是常见的做法
      if (BrowserWindow.getAllWindows().length === 0) createWindow()
    })
  } catch (error) {
    console.error('Error in app.whenReady:', error)
  }
})

// 应用退出时停止HLS服务器和FFmpeg转码服务
app.on('before-quit', () => {
  console.log('应用即将退出，停止HLS服务器和FFmpeg转码服务...')
  globalShortcut.unregisterAll()
  hlsHttpServer.stop()
  ffmpegManager.stopAllStreams()
})

// 当所有窗口关闭时退出应用，但在macOS上除外
app.on('window-all-closed', () => {
  // 注销所有全局快捷键
  globalShortcut.unregisterAll()

  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 在app.whenReady()中添加
// ipcMain.on('get-app-config', (event) => {
//   event.reply('app-config', global.appConfig || { server: { hlsPort: 8080 } })
// })
